www.gusucode.com > VC++ 小型会员积分管理系统-源码程序 > VC++ 小型会员积分管理系统-源码程序/code/AcPtsRecorder/listctrlex/ListCtrlEx.cpp
//Download by http://www.NewXing.com // ListCtrlEx.cpp : implementation file // #include "stdafx.h" #include "ListCtrlEx.h" #include ".\listctrlex.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CListCtrlEx CListCtrlEx::CListCtrlEx() { m_nSortedCol = 0; m_bAscending = FALSE; } CListCtrlEx::~CListCtrlEx() { } BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl) //{{AFX_MSG_MAP(CListCtrlEx) //}}AFX_MSG_MAP ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CListCtrlEx message handlers void CListCtrlEx::PreSubclassWindow() { // TODO: Add your specialized code here and/or call the base class EnableToolTips(TRUE); if(GetHeaderCtrl()) m_SkinHeaderCtrl.SubclassWindow(GetHeaderCtrl()->m_hWnd); DWORD dwStyle = GetStyle(); ModifyStyleEx(0, WS_EX_CLIENTEDGE); dwStyle = GetStyle(); dwStyle = GetExtendedStyle(); SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_TRACKSELECT); dwStyle = GetExtendedStyle(); SetBkColor(RGB(188,194,212)); SetTextBkColor(RGB(188,194,212)); CListCtrl::PreSubclassWindow(); } INT_PTR CListCtrlEx::OnToolHitTest(CPoint point, TOOLINFO * pTI) const { int row, col; RECT cellrect; row = CellRectFromPoint(point, &cellrect, &col ); if ( row == -1 ) return -1; pTI->hwnd = m_hWnd; pTI->uId = (UINT)((row<<10)+(col&0x3ff)+1); pTI->lpszText = LPSTR_TEXTCALLBACK; pTI->rect = cellrect; return pTI->uId; } int CListCtrlEx::CellRectFromPoint(CPoint &point, RECT *cellrect, int *col) const { int colnum; // Make sure that the ListView is in LVS_REPORT if( (GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT ) return -1; // Get the top and bottom row visible int row = GetTopIndex(); int bottom = row + GetCountPerPage(); if( bottom > GetItemCount() ) bottom = GetItemCount(); // Get the number of columns CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0); int nColumnCount = pHeader->GetItemCount(); // Loop through the visible rows for( ;row <=bottom;row++) { // Get bounding rect of item and check whether point falls in it. CRect rect; GetItemRect( row, &rect, LVIR_BOUNDS ); if( rect.PtInRect(point) ) { // Now find the column for( colnum = 0; colnum < nColumnCount; colnum++ ) { int colwidth = GetColumnWidth(colnum); if( point.x >= rect.left && point.x <= (rect.left + colwidth ) ) { RECT rectClient; GetClientRect( &rectClient ); if( col ) *col = colnum; rect.right = rect.left + colwidth; // Make sure that the right extent does not exceed // the client area if( rect.right > rectClient.right ) rect.right = rectClient.right; *cellrect = rect; return row; } rect.left += colwidth; } } } return -1; } BOOL CListCtrlEx::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult ) { // need to handle both ANSI and UNICODE versions of the message TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; CString strTipText; UINT_PTR nID = pNMHDR->idFrom; if( nID == 0 ) // Notification in NT from automatically return FALSE; // created tooltip int row = (int)(((nID-1) >> 10) & 0x3fffff ); int col = (int)((nID-1) & 0x3ff); strTipText = GetItemText( row, col ); #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) lstrcpyn(pTTTA->szText, strTipText, 80); else _mbstowcsz(pTTTW->szText, strTipText, 80); #else if (pNMHDR->code == TTN_NEEDTEXTA) _wcstombsz(pTTTA->szText, strTipText, 80); else lstrcpyn(pTTTW->szText, strTipText, 80); #endif *pResult = 0; return TRUE; // message was handled } int CALLBACK CListCtrlEx::CallbackCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParam3) { CListCtrlEx* pSortedList = (CListCtrlEx *)(lParam3); CString str1,str2; LVFINDINFO info; int nIndex; info.flags = LVFI_PARAM; info.lParam = lParam1; nIndex = pSortedList->FindItem(&info); if(-1 != nIndex) str1 = pSortedList->GetItemText(nIndex,pSortedList->m_nSortedCol); info.lParam = lParam2; nIndex = pSortedList->FindItem(&info); if(-1 != nIndex) str2 = pSortedList->GetItemText(nIndex,pSortedList->m_nSortedCol); return pSortedList->CompareItems (str1, str2); } int CListCtrlEx::CompareItems(CString& str1, CString& str2) { return m_bAscending == (str1>=str2); } BOOL CListCtrlEx::SortList(int nCol, bool bAscending) { m_bAscending = bAscending; m_nSortedCol = nCol; return SortItems(CallbackCompareItems,(DWORD_PTR)this); } bool CListCtrlEx::GetAscending() { m_bAscending = !m_bAscending; return m_bAscending; } BOOL CListCtrlEx::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) { // TODO: 在此添加专用代码和/或调用基类 BOOL bResult = CListCtrl::Create(dwStyle, rect, pParentWnd, nID); if(GetHeaderCtrl()) m_SkinHeaderCtrl.SubclassWindow(GetHeaderCtrl()->m_hWnd); SetBkColor(RGB(188,194,212)); SetTextBkColor(RGB(188,194,212)); return bResult; }